package com.ccnf.model.mapper;

import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.plugins.pagination.Pagination;
import com.ccnf.model.entity.InvitationRecord;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * <p>
 *  Mapper 接口
 * </p>
 *
 * @author developer
 * @since 2018-06-07
 */
public interface InvitationRecordMapper extends BaseMapper<InvitationRecord> {

    /**
     * 增加邀请函使用次数
     * @param invitationId 邀请函ID
     * @return 返回影响的行数，成功返回1，失败返回0
     */
    Integer incrementUseCount(Long invitationId);

    /**
     * 增加邀请函的浏览次数
     * @param invitationId 邀请函ID
     * @return 返回影响的行数，成功返回1，失败返回0
     */
    Integer incrementBrowseCount(Long invitationId);

    /**
     * 增加邀请函的收藏次数
     * @param invitationId 邀请函ID
     * @return 返回影响的行数，成功返回1，失败返回0
     */
    Integer incrementCollectionCount(Long invitationId);

    /**
     * 增加邀请函的转发次数
     * @param invitationId 邀请函ID
     * @return 返回影响的行数，成功返回1，失败返回0
     */
    Integer incrementForwardCount(Long invitationId);

    /**
     * 减少邀请函的收藏次数
     * @param invitationId 邀请函ID
     * @return 返回影响的行数，成功返回1，失败返回0
     */
    Integer reduceCollectionCount(Long invitationId);

    /**
     * 减少邀请函的总的收藏次数
     * @param invitationId 邀请函ID
     * @return 返回影响的行数，成功返回1，失败返回0
     */
    Integer reduceTotalCollectionCount(Long invitationId);

    /**
     * 获取当前用户所有邀请函总统计数据（今日和总的统计数据），包含浏览，登记，入场
     * @param userId 当前用户ID
     * @param type 统计的字段
     */
    List<Map<String, Object>> selectTotalCount(@Param("expoId") Long expoId,
                                               @Param("userId") Long userId,
                                               @Param("type") Integer type);

    /**
     * 获取用户创建的所有邀请函的统计排行数据，包含浏览，登记，入场和是否关注该邀请函
     * @param page 分页参数
     * @param expoId 展会ID
     * @param userId 当前用户ID
     * @param recordType 记录类型（0：总，1：今日）
     */
    List<Map<String, Object>> selectListCount(Pagination page,
                                              @Param("expoId") Long expoId,
                                              @Param("userId") Long userId,
                                              @Param("recordType") Integer recordType,
                                              @Param("type") Integer type);

    /**
     * 查询创建者的统计数据排行数据，包含浏览，登记，入场，关注
     * @param page 分页参数
     * @param userId 当前用户ID
     * @param type 0：浏览，1：登记，2：入场，3：关注
     */
    List<Map<String, Object>> selectAllUserListCount(Pagination page,
                                                     @Param("expoId") Long expoId,
                                                     @Param("userId") Long userId,
                                                     @Param("type") Integer type);

    /**
     * 更新用户关注自身邀请函
     * @param invitationRecord 邀请函关注数据
     * @return 返回影响的数据行数
     */
    Integer updateStarStatus(InvitationRecord invitationRecord);

    /**
     * 将邀请函今日的统计数据都归零状态
     * @return 返回影响的行数
     */
    Integer emptyToday();

    /**
     * 增加邀请函的登记数量
     * @param invitationId 邀请函ID
     * @return 返回影响的行数，成功返回1，失败返回0
     */
    Integer incrementRegisterCount(Long invitationId);

    /**
     * 增加邀请函的入场数量
     * @param invitationId 邀请函ID
     * @return 返回影响的行数，成功返回1，失败返回0
     */
    Integer incrementEnterCount(Long invitationId);

    /**
     * 查询指定邀请函引用ID的定向用户排行
     * @param invitationId 邀请函ID
     * @param type 0：浏览，1：登记，2：入场
     * @param pagination 分页参数
     */
    List<Map<String, Object>> selectInvitationOrientationRank(@Param("invitationId") Long invitationId,
                                                              @Param("type") Integer type,
                                                              @Param("recordType") Integer recordType,
                                                              @Param("date") Long date,
                                                              Pagination pagination);

    /**
     * 查询指定邀请函引用ID的定向当前用户排行
     * @param invitationId 邀请函ID
     * @param userId 用户ID
     * @param type 0：浏览，1：登记，2：入场
     */
    Map<String, Object> selectInvitationOrientationCurrentUserRank(@Param("invitationId") Long invitationId,
                                                                   @Param("userId") Long userId,
                                                                   @Param("type") Integer type,
                                                                   @Param("recordType") Integer recordType,
                                                                   @Param("date") Long date);

    /**
     * 查询指定邀请函引用ID的定向当前用户排行
     * @param invitationId 邀请函ID
     * @param referenceId 引用的邀请函ID
     * @param type 0：浏览，1：登记，2：入场
     * @param recordType 0：总，1：今日
     * @param reportTime 每日的报表零点时间
     */
    int selectInvitationCurrentUserRank(@Param("invitationId") Long invitationId,
                                         @Param("referenceId") Long referenceId,
                                         @Param("type") Integer type,
                                         @Param("recordType") Integer recordType,
                                         @Param("reportTime") Long reportTime);
}